/*
 *  Copyright (C) 2010 glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.balisunrise.common;

import org.balisunrise.annotation.EventType;
import org.balisunrise.annotation.VisualActionTarget;

/**
 * A ActionProvider contém as classes dos mapas de ações de uma entidade.<br>
 * São disponibilizadas as ações e ações visuais de uma entidade.<br>
 * São criadas as instâncias das ActionCollection's.<br>
 * É controlado as instâncias de ActionCollection por VisualEntity.<br>
 * A A ActionProvider é criada e pega atravéz do ActionMapManager.
 * 
 * @author Glauco
 */
public interface ActionProvider {

    /**
     * Retorna a classe da entidade das ações.
     */
    public Class getEntityClass();

    /**
     * Retorna as classes dos mapas de ações de uma entidade;
     */
    public Class[] getActionMaps();

    /**
     * Cria um novo ActionCollection instânciando as classes dos mapas de ações.
     */
    public ActionCollection createCollection();

    /**
     * Retorna a instância de ActionCollection criada por uma VisualEntity.<br>
     * Quando a instância da ActionCollection ainda não existir é criado e
     * registrado a ActionCollection para a VisualEntity.
     * @param visualEntity a Top VisualEntity das árvores de proprietários.
     * @return A instância de ActionCollection da VisualEntity.
     */
    public ActionCollection getActionCollection(VisualEntity visualEntity);

    /**
     * Registra uma ActionCollection para a VisualEntity.
     *
     * @param visualEntity a VisualEntity.
     * @param actionCollection a ActionCollection.
     */
    public void registerActionCollection(VisualEntity visualEntity,
            ActionCollection actionCollection);

    /**
     * Remove o registor de uma ActionCollection para a VisualEntity.
     *
     * @param visualEntity a VisualEntity.
     */
    public void removeActionCollection(VisualEntity visualEntity);

    /**
     * Retorna um Array de Action para o tipo e alias desejado.
     *
     * @param eventType Tipo de Evento desejado.
     * @param alias Alias desejado.
     * @param property Propriedade adicional, utilizada dependendo do tipo de
     * evento.
     * @return Um Array de Action. Não retorna nulo, se não encontrar nada
     * retornará um Array vazio.
     */
    public Action[] getActions(EventType eventType, String alias,
            String property);

    /**
     * Retorna um Array de VisualAction do tipo desejado.
     *
     * @param targets Alvo desejado para a ação visual.
     * @param alias Alias desejado.
     * @param property Propriedade adicional, utilizada dependendo do tipo de
     * evento.
     * @return Um Array de VisualAction. Não retona nulo, se não encontrar nada
     * retornará um Array vazio.
     */
    public VisualAction[] getVisualActions(VisualActionTarget targets,
            String alias, String property);

    /**
     * Retorna um Array de FieldAction.
     *
     * @param alias Alias desejado.
     * @param property Propriedade adicional, é necessário informar no primeiro
     * item do array de propriedades o nome do campo que a ação visual deve
     * pertencer.
     * @return Um Array de FieldAction. Não retona nulo, se não encontrar nada
     * retornará um Array vazio.
     */
    public FieldAction[] getFieldActions(String alias, String property);
}
